import json
from datetime import datetime
from typing import Optional

import requests

from case.message_notification.dingTalkDingTalk.DingTalkToken import DingTalkToken
from tools.db_model_tool import config_path
from tools.yaml_handle import ReadYaml


def get_notification(alert_data: dict) -> Optional[dict]:
    """
    根据测试结果生成并发送钉钉通知，并艾特全体成员。

    :param test_results: 包含测试结果的 TestResults 实例，以字典形式传递。
    :param report_url: 测试报告的 URL。默认为 None，如果没有提供 URL，将使用默认值。
    :return: 钉钉 API 的响应，如果失败则返回 None。
    """
    # 1. 获取钉钉 Token
    yaml_reader = ReadYaml(config_path)
    dingding_config = yaml_reader.read_yaml["DingTalkSubscriptionRobot"]
    appkey = dingding_config.get("AppKey")
    appsecret = dingding_config.get("AppSecret")

    if not appkey or not appsecret:
        print("钉钉 AppKey 或 AppSecret 缺失，无法获取 Token。")
        return None

    token = DingTalkToken(appkey, appsecret).get_token()

    if not token:
        print("无法获取钉钉 Token，通知发送失败。")
        return None
    # 2. 设置钉钉通知消息模板
    # notification_message = {
    #     "title": "🔥 利刃系统PC端 自动化测试报告 🔥",
    #     "text": (
    #         "## 🧪 自动化测试结果通知\n\n"
    #         f"> 📅 **执行日期**: {test_results.get('today_date', '未知')}\n\n\n\n"
    #         f">📊 用例执行情况\n\n"
    #         f">🔹 **测试总数**：{test_results.get('total', '未知')}\n\n"
    #         f">✅ **通过用例**：{test_results.get('passed', 0)}\n\n"
    #         f">❌ **失败用例**：{test_results.get('failed', 0)}\n\n"
    #         f">⚠️ **跳过用例**：{test_results.get('skipped', 0)}\n\n"
    #         f">💥 **异常用例**：{test_results.get('broken', 0)}\n\n"
    #         f">🌀 **未知状态**：{test_results.get('unknown', 0)}\n\n\n\n"
    #         "---\n\n"
    #         "🔗 **测试报告地址**：\n\n\n\n"
    #         f">[👉 点击查看详细报告]({report_url})\n\n\n\n"
    #         "#### 👥 @所有人 请关注测试结果，如有问题及时处理。"
    #     )
    # }

    task_id = alert_data.get("task_id", "未知")
    error_msg = alert_data.get("error", "无错误详情")
    notification_message = {
        "title": "⏰ 调度任务执行告警",
        "text": (
            "### 🚨 任务执行失败通知\n"
            f"​**​任务ID​**​: {task_id}\n"
            f"​**​失败时间​**​: {datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')} (UTC)\n"
            f"​**​错误信息​**​: \n`{error_msg}`\n\n"
            "---\n"
            "👥 @所有人 请及时处理！"
        )
    }

    # 3. 发送消息到钉钉群并艾特全体成员
    headers = {
        "Content-Type": "application/json",
        "x-acs-dingtalk-access-token": token
    }
    payload = {
        "msgParam": json.dumps(notification_message),
        "msgKey": "sampleMarkdown",
        "openConversationId": yaml_reader.read_yaml["DingTalkSubscriptionRobot"]["message"]["openConversationId"],
        # 如果此 ID 是动态生成的，请考虑将其参数化
        "robotCode": yaml_reader.read_yaml["DingTalkSubscriptionRobot"]["message"]["robotCode"]
        # 同样，如果此 Code 是动态生成的，请考虑将其参数化
    }

    try:
        response = (requests.
                    post(yaml_reader.read_yaml["DingTalkSubscriptionRobot"]["RobotUrl"],
                         json=payload,
                         headers=headers))
        response.raise_for_status()
        return response.json()
    except requests.RequestException as e:
        print(f">发送钉钉消息时出错: {e}")
        return None


if __name__ == '__main__':
    # 构造假数据
    test_results = {
        "today_date": "2025-04-11",
        "total": 20,
        "passed": 17,
        "failed": 2,
        "skipped": 0,
        "broken": 1,
        "unknown": 0
    }
    # 报告链接（你可以替换为真实地址）
    report_url = "http://192.168.31.107:9999"

    # 调用通知函数
    result = get_notification(test_results, report_url + "index.html")

    print("钉钉通知发送结果：", result)
